import { defineStore } from 'pinia';

export const useTabsBarStore = defineStore('tabbar', {
  state: () => ({
    visitedRoutes: [], // 访问过的路由列表
  }),
  actions: {
    /**
     * @description 添加访问过的路由
     * @param {object} route 当前路由对象
     */
    addVisitedRoute(route) {
      let target = this.visitedRoutes.find((item) => item.path === route.path);
      if (target) {
        if (route.fullPath !== target.fullPath) Object.assign(target, route);
        return;
      }
      this.visitedRoutes.push(Object.assign({}, route));
    },

    /**
     * @description 删除指定路由
     * @param {object} route 要删除的路由对象
     */
    delVisitedRoute(route) {
      this.visitedRoutes.forEach((item, index) => {
        if (item.path === route.path) this.visitedRoutes.splice(index, 1);
      });
    },

    /**
     * @description 删除其他路由（仅保留当前路由和固定路由）
     * @param {object} route 当前路由对象
     */
    delOthersVisitedRoute(route) {
      this.visitedRoutes = this.visitedRoutes.filter(
        (item) => item.meta.affix || item.path === route.path
      );
    },

    /**
     * @description 删除左侧路由（包括当前路由左侧的所有路由）
     * @param {object} route 当前路由对象
     */
    delLeftVisitedRoute(route) {
      let index = this.visitedRoutes.length;
      this.visitedRoutes = this.visitedRoutes.filter((item) => {
        if (item.name === route.name) index = this.visitedRoutes.indexOf(item);
        return item.meta.affix || index <= this.visitedRoutes.indexOf(item);
      });
    },

    /**
     * @description 删除右侧路由（包括当前路由右侧的所有路由）
     * @param {object} route 当前路由对象
     */
    delRightVisitedRoute(route) {
      let index = this.visitedRoutes.length;
      this.visitedRoutes = this.visitedRoutes.filter((item) => {
        if (item.name === route.name) index = this.visitedRoutes.indexOf(item);
        return item.meta.affix || index >= this.visitedRoutes.indexOf(item);
      });
    },

    /**
     * @description 删除所有路由（仅保留固定路由）
     */
    delAllVisitedRoutes() {
      this.visitedRoutes = this.visitedRoutes.filter((item) => item.meta.affix);
    },

    /**
     * @description 更新指定路由
     * @param {object} route 要更新的路由对象
     */
    updateVisitedRoute(route) {
      this.visitedRoutes.forEach((item) => {
        if (item.path === route.path) Object.assign(item, route);
      });
    },

    /**
     * @description 异步删除指定路由
     * @param {object} route 要删除的路由对象
     */
    async delRoute(route) {
      await this.delVisitedRoute(route);
      return [...this.visitedRoutes];
    },

    /**
     * @description 异步删除其他路由
     * @param {object} route 当前路由对象
     */
    async delOthersRoutes(route) {
      await this.delOthersVisitedRoute(route);
      return [...this.visitedRoutes];
    },

    /**
     * @description 异步删除左侧路由
     * @param {object} route 当前路由对象
     */
    async delLeftRoutes(route) {
      await this.delLeftVisitedRoute(route);
      return [...this.visitedRoutes];
    },

    /**
     * @description 异步删除右侧路由
     * @param {object} route 当前路由对象
     */
    async delRightRoutes(route) {
      await this.delRightVisitedRoute(route);
      return [...this.visitedRoutes];
    },

    /**
     * @description 异步删除所有路由
     */
    async delAllRoutes() {
      await this.delAllVisitedRoutes();
      return [...this.visitedRoutes];
    },
  },
});